/*
 *
 * @Desc 南瑞继保设备作为 TCP 服务端开放6000端口
 * 本侧连接装置作为客户端，设置目标port 6000
 *
 * */

#ifndef NRJBCONNECTION_H
#define NRJBCONNECTION_H

//#include <Server.h>
#include <QTcpSocket>
#include <QObject>
#include <QTimer>
#include "NRJB/NRJB103Constructer.h"
#include "utils.h"
#include <QMessageBox>

#define SEND_INTERVEAL 100

class NRJBConnection:public QObject
{
    Q_OBJECT
public:
   NRJBConnection();

   virtual ~NRJBConnection();

   void setIPPortAndConnect(const QString &destDevIp, const QString &localIp, const QString &port);
   void connectToDevice();         // 连接到保护设备服务器
   void sendTcpMsg(QString &msg);  // 发送tcp消息到保护服务端
   void sendTcpMsg(QByteArray &msg);  // 发送tcp消息到保护服务端
   void sendTcpMsg(const QByteArrayList &msgList);  // 发消息队列

   QByteArray getRecvTcpMsg();
   void disconnectFromDevice();

   void startHeartTimer();
   void stopHeartTimer();

   QStringList getLocalHostIPList();

   bool m_tcpClientConnectedState;  // socket 连接状态

signals:
    void sig_readyRead();
    void sig_disconnect();
    void sig_connected();    // tcp 客户端段连接服务端成功
    void sig_sendMsg(QString);   // 回馈给测试 UI界面添加显示已经发送的消息
    void sig_sendCMDListFinished(); //工作线程通知完成消息队列发送任务
    void sig_connectTimeOut();      // 连接超时，在客户端点击连接不成功时提醒

public slots:
    void onSocketDisconnected();
    void onRecvTcpMsg();
    void slot_connectSuccess();     // 连接成功设置client状态为 true
    void slot_sendeartBeatMsg();

    void slot_connectDevice();

    void slot_sendTcpMsgList();

    //当执行发送命令列表来获取全部感兴趣的信息时候，每次发送都在收到一个报文的后发送下一个
    void slot_sendTcpMsgListNextOne();

private:
    void displayError(QAbstractSocket::SocketError socketError);

private:
    QTcpSocket *m_tcpClientSocket;

    // 通信参数
    QString m_port; // 保护的监听端口
    QString m_localAddr;    // 本机与保护通讯的ip地址
    QString m_localAddrLastPart;    // 本机地址的最后一段，192.168.0.35，0x2300占两个字节
    QString m_destDevAddr;   //保护设备的ip地址，目标设备地址
    QString m_destDevAddrLastPart; // 目标设备地址 ，占两个字节

    QString m_srcDevAddr;   // 从m_local中取最后一个字段 ，占两个字节
    QString m_cpuAddr; //通过分割 m_destDevAddr获取，在asdu中使用，占一个字节

    QByteArray m_recvBuffer;     // 消息接收缓冲区
    NRJB103Constructer *m_packetConstructer;
    QTimer m_heartTimer;    // tcp 心跳报文
    int m_dataNo; // 每次发送消息， apci 的消息编号自增一次,初始值为0；

    QTimer m_timerConnct;
    int m_connectTimeLimit;     // 配置连接超时次数，每次点击连接的时候置为10

    QTimer m_timerSendCmdList; //
    int  m_indexSendCmdList = 0;    // 发送命令队列的序号
    QByteArrayList m_cmdListReadBill;    //读取信息的命令序列

    // 重新发送tcp消息定时器, 基础发送函数，发送失败重新尝试
    QTimer m_timerRetry;
};

#endif // NRJBCONNECTION_H
